package beans;

import java.util.logging.Level;
import java.util.logging.Logger;
import pool.*;
import java.util.*;
import java.sql.*;

/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeSuivis {

    private ArrayList<SuiviBean> listeSuivis;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeSuivis(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des suivis actuellement dans la base
    public ArrayList<SuiviBean> getListeSuivis() {
	PreparedStatement ps;
	listeSuivis = new ArrayList<SuiviBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT * FROM app.suivis");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		SuiviBean suivi = new SuiviBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			new Integer(rs.getString(3)),
			new Integer(rs.getString(4)));
		listeSuivis.add(suivi);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeSuivis;
    }

    public void addSuivi(SuiviBean sb) {
        if (!this.suit(sb.getId_flux(), sb.getId_utilisateur())) {
            try {
                this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
                PreparedStatement ps;
                System.out.println("Ajout du suivi");

                ps = connexion.prepareStatement("Insert into app.suivis (id_utilisateur, id_flux, peutPoster) VALUES ("
                        + sb.getId_utilisateur() + ", "
                        + sb.getId_flux() + ", "
                        + sb.getPeutPoster() + ")");
                ps.executeUpdate();
                System.out.println("Suivi ajouté avec succès.");

                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void removeSuivi(int id_flux, int id_utilisateur) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppresion du suivi ");
	    ps = connexion.prepareStatement("DELETE FROM app.suivis"
                    + " WHERE id_flux="+id_flux
                    + " AND id_utilisateur="+id_utilisateur);
	    ps.executeUpdate();
	    System.out.println("Suivi retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public SuiviBean getById(int id_suivi) {
	for (SuiviBean sb : this.getListeSuivis()) {
	    if (sb.getId_suivi() == (id_suivi)) {
		System.out.println("Suivis d'id " + sb.getId_suivi());
		return sb;
	    }
	}
	return null;
    }

    public ArrayList<SuiviBean> getByUser(int id_utilisateur) {
	ArrayList<SuiviBean> listeSuivis = new ArrayList<SuiviBean>();
	for (SuiviBean sb : this.getListeSuivis()) {
	    if (sb.getId_utilisateur() == (id_utilisateur)) {
		System.out.println("Suivi d'id " + sb.getId_suivi());
		if (!listeSuivis.contains(sb)) {
		    listeSuivis.add(sb);
		}
	    }
	}
	return listeSuivis;
    }

    public boolean suit(int id_flux, int id_utilisateur) {
	for (SuiviBean sb : this.getByUser(id_utilisateur)) {
            if (sb.getId_flux() == id_flux) {
                return true;
            }
	}
        return false;
    }
    
    public boolean peutPoster(int id_flux, int id_utilisateur) {
	for (SuiviBean sb : this.getByUser(id_utilisateur)) {
            if (sb.getId_flux() == id_flux) {
                return (sb.getPeutPoster() == 1);
            }
	}
        return false;
    }
    
    /**
     * @param idUtilisateur
     * @return une liste de flux que l'utilisateur suit
     */
     public ArrayList<FluxBean> getListFluxSuivi(int idUtilisateur, ListeFlux listeFluxBDD){
        ArrayList<FluxBean> listeFlux = new ArrayList<FluxBean>();

        if(this.listeSuivis == null)
            return null;
        
        for (SuiviBean sb : this.getListeSuivis()){
            if (sb.getId_utilisateur() == idUtilisateur)
                listeFlux.add(listeFluxBDD.getById(sb.getId_flux()));
        }
        
        return listeFlux;
    }
    
    /**
     * @param id_utilisateur
     * @return le nombre de suivis pour un utilisateur
     */
    public int getNbSuivis(int idUtilisateur){
	int res = 0;
	
	for (SuiviBean sb : this.getListeSuivis()){
	    if(sb.getId_utilisateur() == idUtilisateur)
		res++;
	}
	return res;
    }
    
}
